package br.com.ebc.icontatos.converter;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;

import br.com.ebc.icontatos.helper.DataHelper;
/**
 * 
 * @author alexfigueira
 *Classe para converter o valor de uma campo para time code
 *
 */
public class TimeCodeConverter implements Converter {

	public Object getAsObject(FacesContext context, UIComponent component, String newValue)
			throws ConverterException {
		Date convertedValue = null;

		if (newValue == null) {
			return newValue;
		}
		newValue = newValue.trim();
		if (newValue.length() == 0) {
			return null; // este retorno precisa ser NULL para evitar
							// ClassCastException no m�todo getAsString
		}
		newValue = newValue.replaceAll("[.]", ":");
		newValue = newValue.replaceAll("[,]", ":");
		
		Pattern padrao = Pattern.compile("[0-9]{2}:[0-9]{2}:[0-9]{2}");
		Matcher ocorrencias = padrao.matcher(newValue);
		
		Pattern padraoSemPontos = Pattern.compile("[0-9]{2}[0-9]{2}[0-9]{2}");
		Matcher ocorrenciasSemPontos = padraoSemPontos.matcher(newValue);
		
		boolean isTimeCodeSemPontos = ocorrenciasSemPontos.matches();
		boolean isTimeCode = ocorrencias.matches();
		
		if ( !isTimeCode && !isTimeCodeSemPontos ){
			String rotulo = "" ;
			
			
			
			if(component.getAttributes().get("alt")!=null)
			{
		      rotulo = (String) component.getAttributes().get("alt");
			}
			else
			{
		      rotulo = (String) component.getAttributes().get("id");
			}
			
			
			if (rotulo != null) {
				rotulo = " " + rotulo + ": ";
			} else {
				rotulo = "";
			}
			FacesMessage errMsg = new FacesMessage();
			errMsg.setDetail(rotulo + "Impossível converter valor '" + newValue.trim() + "' "
					+ " para um time code.");
			errMsg.setSeverity(FacesMessage.SEVERITY_ERROR);
			throw new ConverterException(errMsg);	
		} else {
			if (isTimeCode){
				convertedValue = DataHelper.timeCodeStringParaData(newValue);
			} else if (isTimeCodeSemPontos){
				convertedValue = DataHelper.timeCodeStringSemPontosParaData(newValue);
			}
		}
		return convertedValue;
	}

	public String getAsString(FacesContext context, UIComponent component, Object value)
			throws ConverterException {
		String inputVal = null;
		if (value == null) {
			return null;
		}
		try {
			DateFormat formatDate = new SimpleDateFormat("HH:mm:ss");
			inputVal = formatDate.format((Date)value);
			//inputVal = new DecimalFormat("#,##0.00").format((Double) value);
		} catch (ClassCastException ce) {
			// Este excecão nunca deveria ser disparada !
			FacesMessage errMsg = new FacesMessage("Impossível converter para String!");
			errMsg.setSeverity(FacesMessage.SEVERITY_FATAL);
			throw new ConverterException(errMsg);
		}
		return inputVal;
	}
}
